home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
051-075
/
scopedisk51
/
wcs20
/
willi
< prev
next >
Wrap
Text File
|
1995-03-18
|
24KB
|
781 lines
WINDOW 1,"WCS v2.0",(417,11)-(617,59),31,-1
COLOR 3:PRINT "Initializing..."
CLEAR,38000&
DEFINT a-z
at&=0:text&=0:printat&=0:shadow&=0:sxy&=0:scolr&=0:sbox&=0:dbox&=0
drawmode&=0:title&=0:loadfont&=0:usefont&=0:killfont&=0:style&=0
refresh&=0:iffload&=0:iffsave&=0:loadRGB&=0:saveRGB&=0:request&=0
checkfile&=0:bload&=0:bsave&=0:bopenr&=0:bopenw&=0:bread&=0:bwrite&=0
seek&=0:bclose&=0:getmem&=0:freemem&=0:zero&=0:copy&=0:w7&=0:bye&=0
filesize&=0:ml&=0
brick=0:rock=1:willi=2:gold=3:dirt=4:empty=5
a=0:c=0:i=0:m=0:freq=0:crunched=0:greed=0:part=2
x=0:y=0:wx=0:wy=0:rx=0:ry=0:joyx=0:joyy=0:mx=0:my=0
inthebox=0:roll=0:listflag=0:newrandom=-1
top$="___":default$="NEW":nl$=CHR$(0)
GOSUB setstart
DIM board(30,17),backboard(30,17,6)
DIM topscore!(6),topname$(6),title$(6)
DIM pparts(36,5),empty(1),brick(63),rgb(32)
empty(0)=-1:empty(1)=-1
DIM ml(99)
OPEN "wcs/ml_loader" FOR INPUT AS #1
FOR i=0 TO 99:ml(i)=CVI(INPUT$(2,1)):NEXT
CLOSE #1
ml&=VARPTR(ml(0)):ml& SADD("wcs/jlib"+nl$),VARPTR(at&),WINDOW(7)
ERASE ml
WINDOW CLOSE 1
SCREEN 1,640,200,4,2
WINDOW 2,SPACE$(14)+"T H E W I L L I C O N S T R U C T I O N S E T",,0,1
w7& WINDOW(7):sxy& 2,1
CHDIR "wcs"
file$="RGB"
checkfile& SADD(file$+nl$),VARPTR(filesize&)
IF filesize&<>64 THEN noload
bload& SADD(file$+nl$),VARPTR(rgb(0)),64
loadRGB& VARPTR(rgb(0)),32
file$="pieces.parts"
checkfile& SADD(file$+nl$),VARPTR(filesize&)
IF filesize&<>376 THEN noload
bload& SADD(file$+nl$),VARPTR(pparts(0,0)),376
copy& VARPTR(pparts(3,brick)),VARPTR(brick(0)),34
file$=default$
GOSUB brick:LINE (0,0)-(630,186),,bf:PATTERN ,empty
msgbox 2,"Welcome to The Willi Construction Set!"
GOSUB flash
scolr& 1,8:shadow& 145,24,SADD("The Willi Construction Set"+nl$)
shadow& 133,34,SADD("Version 2.0 - by john everett"+nl$)
scolr& 2,9
shadow& 57,54,SADD("This program found first on"+nl$)
scolr& 1,6:shadow& 283,54,SADD("American PeopleLINK!"+nl$)
scolr& 2,1:shadow& 283,53,SADD("American PeopleLINK!"+nl$)
scolr& 3,10:shadow& 101,74,SADD("Use joystick (port2) to control Willi"+nl$)
scolr& 4,11:shadow& 73,84,SADD("Collect flowers while avoiding falling rocks"+nl$)
scolr& 5,12:shadow& 93,94,SADD("If you get stuck, press `r' for `rock'"+nl$)
scolr& 6,13:shadow& 65,104,SADD("(the rock will land on Willi's head, however)"+nl$)
scolr& 7,14:shadow& 97,114,SADD("Press ESC if you want to quit the game"+nl$)
GOSUB scoreboard
GOSUB newscreens
MENU 1,0,1,"System"
MENU 1,1,1,"About "
MENU 1,2,1,"Instructions"
MENU 1,3,1,"List Willi "
MENU 1,4,1,"Quit Willi "
MENU 2,0,1,"Options"
MENU 2,1,1,"Load Screens"
MENU 2,2,1,"Edit Screens"
MENU 2,3,1,"Edit Pieces "
MENU 2,4,1,"Zero Scores "
MENU 2,5,1,"Restart Game"
MENU 3,0,0,""
MENU 4,0,0,""
GOTO start
mainloop:
joyx=0:joyy=0
WHILE joyx=0 AND joyy=0 AND m=0 AND key$=""
joyx=STICK(2):joyy=STICK(3):m=MENU(0):key$=INKEY$:GOSUB ptime
WEND
IF key$<>"" OR m<>0 THEN whatkey
x=wx+joyx:y=wy+joyy
IF x>30 OR x<0 OR y>17 OR y<0 THEN mainloop
IF board(x,y)=brick THEN mainloop
IF joyx<>0 AND joyy<>0 AND board(x,wy)<2 AND board(wx,y)<2 THEN mainloop
IF board(x,y)=rock THEN pushrock
IF board(x,y)=gold THEN greed=greed-1
board(wx,wy)=empty:LINE (wx*16,wy*8)-STEP(15,7),0,bf
wx=x:wy=y:SOUND 200,.2,255:SOUND 200,.2,255,1
board(wx,wy)=willi:PUT (16*wx,8*wy),pparts(0,willi),PSET
IF wy-joyy>0 THEN
IF board(wx-joyx,wy-joyy-1)=rock THEN rx=wx-joyx:ry=wy-joyy-1:GOSUB rockfall
END IF
IF greed<1 THEN GOTO nextlevel
GOTO mainloop
rockfall:
a=0
numfall:
IF board(rx,ry-a)=rock THEN a=a+1:IF ry-a>-1 THEN numfall
FOR i=0 TO a-1:x=rx:y=ry-i:GOSUB howfall:NEXT
RETURN
howfall:
roll=0
IF y+1>17 THEN bottom
IF board(x,y+1)=empty THEN
LINE (x*16,y*8)-STEP(15,7),0,bf
board(x,y)=empty:y=y+1:board(x,y)=rock
PUT (16*x,8*y),pparts(0,rock),PSET
SOUND 4000-200*y,.2,255
GOTO howfall
END IF
GOSUB ptime
IF board(x,y+1)=willi THEN
LINE (x*16,y*8)-STEP(15,7),0,bf
y=y+1:GOTO crunch
END IF
IF board(x,y+1)=rock THEN
IF x>0 THEN
IF board(x-1,y)=empty AND (board(x-1,y+1)=willi OR board(x-1,y+1)=empty) THEN roll=-1
END IF
IF x<30 THEN
IF board(x+1,y)=empty AND (board(x+1,y+1)=willi OR board(x+1,y+1)=empty) THEN
IF roll THEN roll=SGN(RND-.5) ELSE roll=1
END IF
END IF
IF roll<>0 AND board(x+roll,y)=empty THEN
board(x,y)=empty:board(x+roll,y)=willi
LINE (x*16,y*8)-STEP(15,7),0,bf
x=x+roll:GOTO howfall
END IF
END IF
bottom:
SOUND 100,1,255,0:SOUND 100,1,255,1
RETURN
pushrock:
IF x+joyx<0 OR x+joyx>30 OR joyy<>0 THEN mainloop
IF board(x+joyx,wy)<>empty THEN mainloop
LINE (wx*16,wy*8)-STEP(15,7),0,bf
LINE (x*16,y*8)-STEP(15,7),0,bf
board(wx,wy)=empty
wx=x:wy=y
board(wx,wy)=willi
x=x+joyx
board(x,y)=rock
PUT (16*wx,8*wy),pparts(0,willi),PSET
PUT (16*x,8*y),pparts(0,rock),PSET
SOUND 700,.2,255,0:SOUND 700,.2,255,1
IF y<17 THEN IF board(x,y+1)=empty THEN rx=x:ry=y:GOSUB rockfall
IF wx>0 AND wy>0 THEN
IF board(wx-joyx,wy-1)=rock THEN rx=wx-joyx:ry=wy-1:GOSUB rockfall
END IF
GOTO mainloop
ptime:
COLOR level+8,level+1:LOCATE 2*level+3,65
IF level>0 THEN PRINT USING "####.#";TIMER-starttime!
RETURN
whatkey:
endtime!=TIMER-starttime!
IF m<>0 THEN ON m GOTO menu1,menu2
IF key$=CHR$(27) THEN quit
IF key$="R" THEN newrandom=-1
IF UCASE$(key$)="R" THEN x=wx:y=wy:GOTO crunch
IF key$=CHR$(139) THEN GOSUB instructions:GOTO start
IF key$=>"0" AND key$<="6" THEN
msgbox 1,"WARPING DISQUALIFIES ALL HIGH SCORES FOR THIS GAME"
GOSUB checkbox
IF inthebox THEN
IF topflag THEN GOSUB hurrah
level=VAL(key$):topflag=1
msgbox 1,"Warping to Level"+STR$(level)
GOTO start
END IF
END IF
key$="":starttime!=TIMER-endtime!
GOTO mainloop
brick: PATTERN ,brick:POKE WINDOW(8)+29,-3 AND 255:COLOR 15,0:RETURN
setstart:
IF topflag THEN GOSUB hurrah
man=10:level=0:topflag=0:startflag=0
starttime!=0:endtime!=0:totaltime!=0
RETURN
crunch:
msgbox 1,"OUCH!!! --- THAT HURTS!!!"
FOR freq=0 TO 3000 STEP 200
PUT (16*x,8*y),pparts(0,willi),PSET
SOUND 1.25*freq,.2,255
PUT (16*x,8*y),pparts(0,rock),PSET
SOUND freq,.2,255,1
GOSUB ptime
NEXT
GOSUB flash
man=man-1
scolr& 2,9:shadow& 168,32,SADD("A cat has nine lives."+nl$)
scolr& 3,10:shadow& 192,48,SADD("Willi has ten!"+nl$)
scolr& 4,11:shadow& 88,64,SADD("You have just wasted one of those lives!"+nl$)
FOR i=96 TO (9-man)*32+96 STEP 32:PUT (i,80),pparts(0,rock),PSET:NEXT
FOR i=i TO 384 STEP 32:PUT (i,80),pparts(0,willi),PSET:NEXT
scolr& 5,12:shadow& 160,96,SADD("Willi has lives left."+nl$)
scolr& 6,13:shadow& 232,96,SADD(STR$(man)+nl$)
IF man=0 THEN
FOR i=0 TO 7
dbox& 154,76,i,i+7,SADD("You have killed Willi!"+nl$)
SOUND 400-5*i,2,255:SOUND 400-i*11,2,255,1
pause 1!
LINE (144,76)-STEP(200,14),0,bf
SOUND 300-5*i,2,255:SOUND 300-i*11,2,255,1
pause 1!
NEXT
GOTO restart
ELSE
pause 3!
END IF
crunched=1
nextlevel:
endtime!=TIMER-starttime!
IF level>0 THEN
COLOR level+8,level+1:LOCATE 2*level+3,65:PRINT USING "####.#";endtime!
COLOR 7,0:LOCATE 19,65:PRINT USING "####.#";totaltime!+endtime!;
END IF
IF crunched=1 THEN crunched=0:GOTO start
IF level>0 AND topflag<1 THEN
IF endtime!<topscore!(level) OR topscore!(level)=0 THEN
topscore!(level)=endtime!:topname$(level)="****":topflag=-1
END IF
COLOR level+8,level+1
LOCATE 2*level+3,73:PRINT USING "####.#";topscore!(level)
totaltime!=totaltime!+endtime!
END IF
endtime!=0
level=level+1:IF level>6 THEN winner
start:
ON startflag GOTO latestart,verylatestart
IF level=0 AND newrandom=-1 THEN GOSUB randomlevel
GOSUB getboard
latestart:
msgbox 1,file$+" - Level"+STR$(level)+": "+title$(level)
GOSUB showboard
verylatestart:
startflag=0
msgbox 2,"Press FIRE! button to start playing"
key$="":WHILE STRIG(3)=0 AND key$="" AND m=0:key$=INKEY$:m=MENU(0):SLEEP:WEND
msgbox 2,""
starttime!=TIMER-endtime!
GOTO mainloop
getboard:
copy& VARPTR(backboard(0,0,level)),VARPTR(board(0,0)),558
wx=wx(level):wy=wy(level):greed=greed(level)
RETURN
showboard:
LINE (0,0)-(498,144),1,bf
LINE (0,0)-(496,143),0,bf
FOR y=0 TO 17
SOUND 400,.4,255,0:SOUND 700,.4,255,1
FOR x=0 TO 30
PUT (16*x,8*y),pparts(0,board(x,y))
NEXT
NEXT
SOUND 400,1,255,0:SOUND 800,1,255,1
RETURN
randomlevel:
SOUND 400,2,255,0:SOUND 400,2,255,1
GOSUB bestscores
RANDOMIZE TIMER
FOR y=0 TO 17:FOR x=0 TO 30:backboard(x,y,0)=dirt:NEXT:NEXT
FOR i=1 TO 120:backboard(INT(31*RND),INT(17*RND),0)=rock:NEXT
FOR i=1 TO 40:backboard(INT(31*RND),INT(17*RND),0)=brick:NEXT
greed=0
FOR i=1 TO 30
x=INT(31*RND):y=INT(17*RND)
IF backboard(x,y,0)<>gold THEN greed=greed+1
backboard(x,y,0)=gold
NEXT
RESTORE randomlevel
FOR y=40 TO 47
READ key$
FOR x=328 TO 351
IF backboard(x-324,y-35,0)=rock THEN backboard(x-324,y-35,0)=dirt
IF POINT (327,40)=0 THEN
IF POINT (x,y)=1 THEN
IF backboard(x-324,y-35,0)=gold THEN greed=greed-1
backboard(x-324,y-35,0)=rock
END IF
ELSE
IF MID$(key$,x-327,1)="X" THEN
IF backboard(x-324,y-35,0)=gold THEN greed=greed-1
backboard(x-324,y-35,0)=rock
END IF
END IF
NEXT
NEXT
backboard(1,16,0)=willi:wx(0)=1:wy(0)=16:greed(0)=greed
title$(level)="Warm-Up"
newrandom=0
RETURN
DATA "XX---XX---XXXX----XXXX--"
DATA "XX---XX--XX--XX--XX--XX-"
DATA "XX---XX-XX-------XXX----"
DATA "XX-X-XX-XX--------XXX---"
DATA "XXXXXXX-XX----------XXX-"
DATA "XXX-XXX--XX--XX--XX--XX-"
DATA "XX---XX---XXXX----XXXX--"
DATA "------------------------"
bestscores:
msgbox 1,"Here are the Best Scores for "+file$
GOSUB brick:LINE (0,0)-(498,144),,bf:PATTERN ,empty
IF topscore!(0)>0 THEN
i=0:GOSUB fixscore
msg$="* "+score$+" seconds by "+topname$(0)+" *"
LINE (84,19)-(411,59),0,bf
LINE (88,21)-(407,57),1,bf
LINE (92,23)-(403,55),0,bf
scolr& 1,8
shadow& 96,24,SADD("**************************************"+nl$)
shadow& 96,32,SADD("* Best total time for completed game *"+nl$)
shadow& 96,40,SADD(msg$+nl$)
shadow& 96,48,SADD("**************************************"+nl$)
END IF
IF topscore!(1)>0 THEN
LINE (84,67)-(411,124),0,bf
LINE (88,69)-(407,122),1,bf
LINE (92,71)-(403,120),0,bf
FOR i=1 TO 6
IF topscore!(i)>0 THEN
GOSUB fixscore
scolr& i+1,i+8:shadow& 96,8*(i+9)-8,SADD("Best time for Level"+STR$(i)+" is "+score$+" by "+topname$(i)+nl$)
END IF
NEXT
END IF
RETURN
fixscore:
score$=STR$(INT(10*topscore!(i))/10)
IF INSTR(score$,".")=0 THEN score$=score$+".0"
score$=RIGHT$(" "+score$,6)
RETURN
winner:
IF topflag>0 THEN restart
GOSUB flash
msgbox 1,"No more levels!!!"
msgbox 2,"Your initials will now be used in the Warm-Up Screen!"
FOR i=1 TO 120
x=16*INT(RND*27+2):y=8*INT(RND*14+2)
PUT (x,y),pparts(0,willi),PSET
SOUND x*10,.1,255,0:SOUND y*10,.1,255,1
x=16*INT(RND*27+2):y=8*INT(RND*14+2)
PUT (x,y),pparts(0,rock),PSET
SOUND x*10,.1,255,0:SOUND y*10,.1,255,1
NEXT
IF (totaltime!<topscore!(0) OR topscore!(0)=0) AND topflag<1 THEN
topscore!(0)=totaltime!:topname$(0)="****":topflag=-1
END IF
GOTO restart
hurrah:
IF topflag>0 THEN RETURN
msgbox 2,"Congradulations!!! - You have beaten a high score!"
FOR freq=300 TO 1000 STEP 20
SOUND freq,.5,255
SOUND freq*1.25,.5,255,1
SOUND freq*1.5,.5,255,2
SOUND freq*2,.5,255,3
NEXT
msgbox 1,"Enter your initials: ___":getname 389,3,top$
FOR i=0 TO 6
IF topname$(i)="****" THEN topname$(i)=top$
NEXT
GOSUB bestscores
OPEN file$+".scores" FOR OUTPUT AS #1
FOR i=0 TO 6:PRINT #1,topname$(i)","topscore!(i):NEXT
CLOSE #1:KILL file$+".scores.info"
topflag=0
RETURN
flash:
FOR i=0 TO 14:LINE (2*i,i)-(498-2*i,144-i),i,bf:NEXT
LINE (2*i,i)-(498-2*i,144-i),0,bf
RETURN
scoreboard:
LINE (503,3)-STEP(127,152),0,bf
LINE (505,4)-(566,26),8,bf:LINE (569,4)-(630,26),8,bf
LINE (507,5)-(564,25),1,bf:LINE (571,5)-(628,25),1,bf
LINE (509,6)-(562,24),8,bf:LINE (573,6)-(626,24),8,bf
LINE (511,7)-(560,23),1,bf:LINE (575,7)-(624,23),1,bf
COLOR 8,1
printat& 512,8,SADD("-YOUR-"+nl$)
printat& 512,16,SADD("-TIME-"+nl$)
printat& 576,8,SADD("-BEST-"+nl$)
printat& 576,16,SADD("-TIME-"+nl$)
FOR my=5 TO 15 STEP 2
c=(my-5)/2+2
dbox& 505,8*my-12,c+7,c,SADD(" 0.0"+nl$)
dbox& 569,8*my-12,c+7,c,SADD(" 0.0"+nl$)
NEXT
dbox& 505,124,8,1,SADD("TOTAL FOR GAME"+nl$)
dbox& 505,140,7,0,SADD(" 0.0"+nl$)
dbox& 569,140,7,0,SADD(" 0.0"+nl$)
RETURN
checkbox:
msgbox 2,""
dbox& 2,172,8,1,SADD(" Click here to continue operation "+nl$)
dbox& 322,172,8,1,SADD(" Click here to return to game "+nl$)
checkloop:
CALL whoa:IF MOUSE(4)<171 THEN checkloop
IF MOUSE(3)>320 THEN inthebox=0 ELSE inthebox=-1
msgbox 1,"":msgbox 2,""
RETURN
menu1:
m=0
ON MENU(1) GOSUB about,instructions,show,quit
GOTO start
about:
GOSUB flash
scolr& 2,9:shadow& 89,22,SADD("The Willi Construction Set (Version 2.0)"+nl$)
scolr& 1,8:shadow& 189,32,SADD("by john everett"+nl$)
scolr& 6,13:shadow& 181,42,SADD("PeopleLINK ID JAE"+nl$)
scolr& 7,14:shadow& 213,54,SADD("FEATURES:"+nl$)
scolr& 2,9:shadow& 45,64,SADD("Ability to create new screens or edit existing ones"+nl$)
scolr& 3,10:shadow& 113,74,SADD("Ability to edit the playing pieces"+nl$)
scolr& 4,11:shadow& 73,84,SADD("Vanity Board, with best score for each level"+nl$)
scolr& 5,12:shadow& 109,94,SADD("plus best score for total game time"+nl$)
scolr& 6,13:shadow& 113,104,SADD("Initials of best total time scorer"+nl$)
scolr& 7,14:shadow& 97,114,SADD("incorporated into Warm-Up Level screen"+nl$)
GOSUB checkbox:IF NOT inthebox THEN startflag=1:RETURN
instructions:
GOSUB flash
scolr& 1,8:shadow& 197,24,SADD("INSTRUCTIONS:"+nl$)
scolr& 2,9:shadow& 101,39,SADD("Use joystick (port2) to control Willi"+nl$)
scolr& 3,10:shadow& 73,54,SADD("Collect flowers while avoiding falling rocks"+nl$)
scolr& 4,11:shadow& 93,69,SADD("If you get stuck, press `r' for `rock'"+nl$)
scolr& 5,12:shadow& 65,84,SADD("(the rock will land on Willi's head, however)"+nl$)
scolr& 6,13:shadow& 33,99,SADD("Pressing `R' on Warm-Up screens generates a new screen"+nl$)
scolr& 7,14:shadow& 97,114,SADD("Press ESC if you want to quit the game"+nl$)
GOSUB checkbox:IF NOT inthebox THEN startflag=1:RETURN
GOTO about
show:
listflag=-1
GOTO quit
slowquit:
whoa
quit:
IF topflag THEN GOSUB hurrah
MENU RESET
CHDIR "/"
WINDOW CLOSE 2:SCREEN CLOSE 1
WINDOW 1
IF bye&>0 THEN CALL bye&
IF listflag=-1 THEN LIST:CLEAR,25000:END
CLEAR,25000
SOUND 1600,1,255,0:SOUND 2000,1,255,1
SOUND 100,2,255,0:SOUND 125,2,255,1
SYSTEM
END
menu2:
m=0:ON MENU(1) GOSUB loadscreens,editscreen,editpart,clearscores,restart
GOTO start
loadscreens:
msg$=file$
file$="*.screens"+STRING$(340,0)
request& 20,15,SADD("Load new screen:"+nl$),SADD(file$),0
startflag=1
file$=LEFT$(file$,INSTR(file$,nl$)-1)
IF file$="" OR RIGHT$(file$,8)<>".screens" THEN file$="NOT A .screens FILE!":GOTO noload
file$=LEFT$(file$,LEN(file$)-8)
newscreens:
checkfile& SADD(file$+".screens"+nl$),VARPTR(filesize&)
IF filesize&<>6696 THEN file$=file$+".screens":GOTO noload
checkfile& SADD(file$+".names"+nl$),VARPTR(filesize&)
IF filesize&<=0 THEN file$=file$+".names":GOTO noload
msgbox 1,"Loading "+file$+" screens..."
bload& SADD(file$+".screens"+nl$),VARPTR(backboard(0,0,1)),6696
OPEN file$+".names" FOR INPUT AS #1
FOR i=1 TO 6
INPUT #1,title$(i),wx(i),wy(i),greed(i)
NEXT
CLOSE #1
checkfile& SADD(file$+".scores"+nl$),VARPTR(filesize&)
IF filesize&>0 THEN
OPEN file$+".scores" FOR INPUT AS #1
FOR i=0 TO 6:INPUT #1,topname$(i),topscore!(i):NEXT
CLOSE #1
ELSE
FOR i=0 TO 6:topname$(i)="":topscore!(i)=0:NEXT
END IF
GOSUB setstart
printscores:
FOR my=5 TO 15 STEP 2
c=(my-5)/2+2
COLOR c+7,c:printat& 512,8*my-8,SADD(" 0.0"+nl$)
LOCATE my,73:PRINT USING "####.#";topscore!(c-1)
NEXT
COLOR 7,0:printat& 512,144,SADD(" 0.0"+nl$)
LOCATE 19,73:PRINT USING "####.#";topscore!(0)
CLOSE #1
RETURN
noload:
msgbox 1,file$+" not found... Load Aborted!"
BEEP:pause 3!
IF file$=default$ THEN quit
file$=msg$
RETURN
editscreen:
msgbox 1,"THIS FUNCTION WILL DISQUALIFY ALL HIGH SCORES EARNED THIS GAME"
GOSUB checkbox:IF NOT inthebox THEN RETURN
IF topflag THEN GOSUB hurrah
MENU 1,0,0:MENU 2,0,0
GOSUB brick
LINE (503,0)-(631,155),,bf
LINE (0,156)-STEP(630,31),,bf
PATTERN ,empty
dbox& 506,4,8,1,SADD("Return To Game"+nl$)
FOR i=0 TO 5
dbox& 506,16*i+20,i+2,i+9,SADD("Get LEVEL"+MID$(STR$(i+1),2)+" Put"+nl$)
NEXT
dbox& 506,116,7,0,SADD(" Save Screens "+nl$)
LINE (505,132)-STEP(125,11),1,bf
LINE (507,133)-STEP(121,9),0,bf
FOR i=0 TO 5:PUT (20*i+509,134),pparts(0,i),PSET:NEXT
msgbox 1,"Click to change Level"+STR$(level)+" Title: "+LEFT$(title$(level)+SPACE$(32),32)
msgbox 2,"`Get' gets a level to display, `Put' swaps a level with display"
showpart:
LINE (20*part+507,133)-STEP(19,9),8,bf
PUT (20*part+509,134),pparts(0,part),PSET
scrnloop:
CALL whoa:mx=MOUSE(3):my=MOUSE(4)
IF my>156 AND my<171 AND mx>125 AND mx<508 THEN
getname 305,32,title$(level)
printat& 305,160,SADD(LEFT$(title$(level)+SPACE$(32),32)+nl$)
ELSEIF my<145 THEN
IF mx<497 THEN
WHILE MOUSE(0)<0
mx=INT(MOUSE(1)/16):my=INT(MOUSE(2)/8)
IF mx>30 OR my>17 THEN scrnloop
GOSUB boardpart
WEND
ELSE
my=INT((my-4)/16)
IF my<1 THEN donescreens
IF my<7 THEN
IF mx<545 THEN
GOSUB getscrn
ELSEIF mx>588 THEN
GOSUB putscrn
END IF
ELSEIF my=7 THEN
GOSUB savescreens
ELSE
LINE (20*part+507,133)-STEP(19,9),0,bf
PUT (20*part+509,134),pparts(0,part),PSET
part=INT((mx-507)/20)
GOTO showpart
END IF
END IF
END IF
GOTO scrnloop
boardpart:
IF board(mx,my)=gold THEN greed=greed-1
IF part=3 THEN greed=greed+1
board(mx,my)=part
PUT (16*mx,8*my),pparts(0,part),PSET
RETURN
getscrn:
level=my
GOSUB getboard
GOSUB showboard
COLOR 8,1:printat& 305,160,SADD(LEFT$(title$(level)+SPACE$(32),32)+nl$)
RETURN
putscrn:
msgbox 1,"Click on Willi's starting position!"
i=my:whoa:mx=INT(MOUSE(3)/16):my=INT(MOUSE(4)/8)
IF mx>30 OR my>17 THEN CALL dbox&(2,148,8,1,SADD("Aborted."+nl$)):GOTO scrnloop
part=2:GOSUB boardpart -
copy& VARPTR(board(0,0)),VARPTR(backboard(0,0,0)),558
level=i:i=greed:GOSUB getboard:GOSUB showboard
copy& VARPTR(backboard(0,0,0)),VARPTR(backboard(0,0,level)),558
wx(level)=mx:wy(level)=my:greed(level)=i
msgbox 1,"Click to change Level"+STR$(level)+" Title: "+LEFT$(title$(level)+SPACE$(32),32)
RETURN
savescreens:
msg$=file$
file$="*.screens"+STRING$(340,0)
request& 164,15,SADD("SAVE screens as:"+nl$),SADD(file$),1
file$=LEFT$(file$,INSTR(file$,nl$)-1)
IF file$="" THEN file$=msg$:GOSUB showboard:RETURN
IF RIGHT$(file$,8)=".screens" THEN file$=LEFT$(file$,LEN(file$)-8)
file$=UCASE$(file$)
IF file$="STONE-AGE" OR file$="WCS" THEN
msgbox 1,"Aborted. You must use a different filename."
RETURN
END IF
bsave& SADD(file$+".screens"+nl$),VARPTR(backboard(0,0,1)),6696
OPEN file$+".names" FOR OUTPUT AS #1
FOR i=1 TO 6
PRINT #1,title$(i)",";
PRINT #1,wx(i)",";
PRINT #1,wy(i)",";
PRINT #1,greed(i)
NEXT
CLOSE #1:KILL file$+".names.info"
checkfile& SADD(file$+".scores"+nl$),VARPTR(filesize&)
IF filesize&>0 THEN KILL file$+".scores"
GOSUB showboard
RETURN
donescreens:
MENU 1,0,1:MENU 2,0,1
GOSUB brick
LINE (503,0)-(631,155),,bf
LINE (0,145)-(502,155),,bf
LINE (0,156)-STEP(630,31),,bf
PATTERN ,empty
GOSUB scoreboard
msgbox 1,file$+" - Level"+STR$(level)+": "+title$(level)
startflag=2:topflag=1:newrandom=-1
RETURN
editpart:
MENU 1,0,0:MENU 2,0,0
GOSUB brick
LINE (0,0)-(498,144),,bf
LINE (0,156)-STEP(630,31),,bf
PATTERN ,empty
LINE (50,8)-STEP(298,146),0,bf
LINE (54,9)-STEP(290,144),15,bf
dbox& 364,35,4,11,SADD(" STORE PART "+nl$)
dbox& 364,76,5,12,SADD(" SAVE PARTS "+nl$)
dbox& 364,117,6,13,SADD("RETURN TO GAME"+nl$)
FOR c=0 TO 15:dbox& c*38+14,164,c,0,SADD(" "+nl$):NEXT:c=1
LINE (62,169)-STEP(10,4),1,bf
LINE (12,55)-STEP(27,52),0,bf
FOR i=0 TO 4
LINE (16,10*i+56)-STEP(19,9),-8*(i=part),bf
PUT (18,10*i+57),pparts(0,i),PSET
NEXT
whichpart:
FOR my=0 TO 7:FOR mx=0 TO 15
LINE (18*mx+56,18*my+10)-STEP(16,16),POINT (mx+18,my+10*part+57),bf
NEXT:NEXT
partloop:
whoa
IF m=3 THEN m=0:MENU 3,part+1,1:part=MENU(1)-1:GOTO whichpart
mx=MOUSE(3):my=MOUSE(4)
IF mx<10 AND my<5 THEN quit
IF my>163 AND my<178 THEN
LINE (c*38+24,169)-STEP(10,4),0,bf
c=INT((mx-6)/38) AND 15
LINE (c*38+24,169)-STEP(10,4),1,bf
ELSEIF mx>14 AND mx<37 THEN
LINE (16,10*part+56)-STEP(19,9),0,bf
PUT (18,10*part+57),pparts(0,part),PSET
part=INT((my-56)/10)
LINE (16,10*part+56)-STEP(19,9),8,bf
PUT (18,10*part+57),pparts(0,part),PSET
GOTO whichpart
ELSEIF mx>363 AND mx<490 THEN
IF my>35 AND my<50 THEN
GOSUB usepart
ELSEIF my>76 AND my<91 THEN
GOSUB usepart
i=96:filesize&=1
WHILE filesize&>0 AND i<124
i=i+1:checkfile& SADD("pieces.parts."+CHR$(i)+nl$),VARPTR(filesize&)
WEND
IF i<124 THEN
NAME "pieces.parts" AS "pieces.parts."+CHR$(i)
bsave& SADD("pieces.parts"+nl$),VARPTR(pparts(0,0)),376
SOUND 1200,.5,255,1:SOUND 1000,1,255,0
END IF
ELSEIF my>117 AND my<132 THEN
MENU 1,0,1:MENU 2,0,1
GOSUB brick
LINE (0,0)-(498,156),,bf
LINE (0,156)-STEP(630,31),,bf
PATTERN ,empty
RETURN
END IF
ELSEIF mx>55 AND mx<344 AND my>9 AND my<154 THEN
mx=INT((MOUSE(1)-56)/18):my=INT((MOUSE(2)-10)/18)
WHILE MOUSE(0)<0
mx=INT((MOUSE(1)-56)/18)
IF mx<0 THEN mx=0
IF mx>15 THEN mx=15
my=INT((MOUSE(2)-10)/18)
IF mxy<0 THEN my=0
IF my>7 THEN my=7
PSET (mx+18,my+10*part+57),c:LINE (18*mx+56,18*my+10)-STEP(16,16),c,bf
WEND
END IF
GOTO partloop
usepart:
GET (18,10*part+57)-(33,10*part+64),pparts(0,part)
SOUND 1200,.5,255,1:SOUND 1000,1,255,0
RETURN
clearscores:
startflag=2
msgbox 1,"WHAT YOU ARE ABOUT TO DO WILL SET ALL SCORES TO ZERO!"
GOSUB checkbox:IF NOT inthebox THEN start
nochance:
FOR i=6 TO 0 STEP -1
topscore!(i)=0:topname$(i)=""
SOUND 20*i+140,.5,255:SOUND 20*i+140,2,255,1
NEXT
GOSUB printscores
restart:
GOSUB setstart
GOTO start
SUB whoa STATIC
WHILE MOUSE(0)<>0:WEND:WHILE MOUSE(0)=0:SLEEP:WEND
END SUB
SUB pause(delay!) STATIC
WHILE MOUSE(0)<>0:WEND
delay!=TIMER+delay!
WHILE TIMER<delay! AND MOUSE(0)=0:WEND
END SUB
SUB msgbox(y,msg$) STATIC
SHARED brick(),empty(),dbox&,nl$
PATTERN ,brick
POKE WINDOW(8)+29,-3 AND 255:COLOR 15,0
LINE (0,156-16*(y=2))-STEP(630,14),,bf
PATTERN ,empty
IF msg$<>"" THEN CALL dbox&(-1,156-16*(y=2),8,1,SADD(msg$+nl$))
END SUB
SUB getname(x,length,msg$) STATIC
SHARED printat&,nl$
position=1
getmore:
IF position>length THEN position=length
IF position<1 THEN position=1
msg$=LEFT$(msg$+SPACE$(length),length)
COLOR 1,8:printat& x,160,SADD(msg$+nl$)
COLOR 8,1:printat& 8*(position-1)+x,160,SADD(MID$(msg$,position,1)+nl$)
in$="":WHILE in$="":in$=INKEY$:SLEEP:WEND
value=ASC(in$)
IF value=30 THEN
position=position+1
ELSEIF value=31 THEN
position=position-1
ELSEIF value=8 THEN
IF position>1 THEN msg$=LEFT$(msg$,position-2)+MID$(msg$,position)
position=position-1
ELSEIF value=127 AND position<length THEN
msg$=LEFT$(msg$,position-1)+MID$(msg$,position+1)
ELSEIF value=27 THEN
msg$=SPACE$(length):position=1
ELSEIF value>31 AND value<127 THEN
IF position=1 THEN
msg$=in$+MID$(msg$,position)
ELSE
msg$=LEFT$(msg$,position-1)+in$+MID$(msg$,position)
END IF
position=position+1
END IF
IF value<>13 THEN getmore
COLOR 8,1:printat& x,160,SADD(msg$+nl$)
WHILE RIGHT$(msg$,1)=" ":msg$=LEFT$(msg$,LEN(msg$)-1):WEND
END SUB